
package vm.project;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

/**
 *
 * @author florianfourure
 */
public class GestionPoints {
    public ArrayList<Point> tabInitial; 
    
    public ArrayList<ArrayList<Point>> extrapol;
    
    public String nom;
    public String URLImg;
    
    public GestionPoints(ArrayList<Point> tabInitial){
        this.tabInitial=new ArrayList<>(tabInitial);
    }
    
    public ArrayList<ArrayList<Point>> extrapol(double startX,double finalX,double pasX,double startY,double finalY,double pasY){
        extrapol = new ArrayList<ArrayList<Point>>();
        
        Integer nbPointX = (int)((finalX-startX)/pasX);
        Integer nbPointY = (int)((finalY-startY)/pasY);
        
        int nbPoint = tabInitial.size();
        
        for(int i=0;i<nbPointX;i++){
         extrapol.add(new ArrayList<Point>());
         for(int j=0;j<nbPointY;j++){
           Point prov = new Point(((double)i)*((double)pasX)+startX,((double)j)*((double)pasY)+startY,-1);
           extrapol.get(i).add(prov);	
         }
        }

       for(int i=0;i<nbPoint;i++){
           double x = (tabInitial.get(i).getX() - startX) / ((double)pasX);
           double y = (tabInitial.get(i).getY() - startY) / ((double)pasY);

           if( ((int) x)==x && ((int)y)==y && x>=0 && y>=0 && x<nbPointX && y<nbPointY){
             extrapol.get((int)x).get((int)y).setV(tabInitial.get(i).getV());
             extrapol.get((int)x).get((int)y).setK(tabInitial.get(i).getK());
           }
       }

       System.out.println("Calcul des points (il y a : "+nbPointX*nbPointY+" points)\n");
       for(int i=0;i<nbPointX;i++){
         for(int j=0;j<nbPointY;j++){
           if(extrapol.get(i).get(j).getK()<0) {
             extrapol.get(i).get(j).setV(this.interpole(extrapol.get(i).get(j)));
             extrapol.get(i).get(j).setK(new Float(1.0));
           }
         }
       }
       
       return extrapol;
  
    }
    
    
    public double interpole(Point p){
        Integer i;
        double somme = 0.0;
        double sommeWj = 0.0;
  
        for(i=0;i<tabInitial.size();i++){
            sommeWj+= wi(p,tabInitial.get(i));
        }
  
        for(i=0;i<tabInitial.size();i++){
          somme += wi(p,tabInitial.get(i)) * tabInitial.get(i).getV() / sommeWj;
        }
         return somme;
    }
    
    public void sauvegarderDat(String fichier) throws IOException{
        int i,j;
        FileWriter f = new FileWriter(fichier);
        PrintWriter out  = new PrintWriter(f);
    
        for(i=0;i<extrapol.size();i++){
            for(j=0;j<extrapol.get(i).size();j++){
                Point prov = extrapol.get(i).get(j);
                out.println(prov.getX()+" "+prov.getY()+" "+prov.getV());
            }
            out.println();
        }

        out.close();
    }
    
    public double norme(Point p1,Point p2){
        double lesX = (p1.getX() - p2.getX()) * (p1.getX() - p2.getX());
        double lesY = (p1.getY() - p2.getY()) * (p1.getY() - p2.getY());
        return Math.sqrt(lesX + lesY);
    }

    public double wi(Point p,Point pi){
        return 1./Math.pow(norme(p,pi),pi.getK());
    }
    
    public void sauvegarderIMG(String nom, String format, int tailleX,int tailleY){
        TestImage t = new TestImage();
        t.initEchelleCouleur(getVMin(), getVMax());
        sauvegarderIMG(nom, format, tailleX, tailleY, t);
    }
    
    public void sauvegarderIMG(String nom, String format, int tailleX,int tailleY,TestImage t){
        t.creerImage(tailleX,tailleY, extrapol);
        t.sauverImage(nom, format); 
        this.URLImg=nom+"."+format;
    }
    
    public double getXMax(){
        double courant = Double.MIN_VALUE;
        if(extrapol!=null){
            for(ArrayList<Point> ap : extrapol){
                for(Point p : ap){
                    if(p.getX()>courant){
                        courant=p.getX();
                    }
                }
            }
            
        }
        return courant;
    }
    
    public double getXMin(){
        double courant = Double.MAX_VALUE;
        if(extrapol!=null){
            for(ArrayList<Point> ap : extrapol){
                for(Point p : ap){
                    if(p.getX()<courant){
                        courant=p.getX();
                    }
                }
            }
            
        }
        return courant;
    }
    
    public double getYMax(){
        double courant = Double.MIN_VALUE;
        if(extrapol!=null){
            for(ArrayList<Point> ap : extrapol){
                for(Point p : ap){
                    if(p.getY()>courant){
                        courant=p.getY();
                    }
                }
            }
            
        }
        return courant;
    }
    
    public double getYMin(){
        double courant = Double.MAX_VALUE;
        if(extrapol!=null){
            for(ArrayList<Point> ap : extrapol){
                for(Point p : ap){
                    if(p.getY()<courant){
                        courant=p.getY();
                    }
                }
            }
        }
        return courant;
    }
    
    public double getVMax(){
        double courant = Double.MIN_VALUE;
        if(extrapol!=null){
            for(ArrayList<Point> ap : extrapol){
                for(Point p : ap){
                    if(p.getV()>courant){
                        courant=p.getV();
                    }
                }
            }
            
        }
        return courant;
    }
    
    public double getVMin(){
        double courant = Double.MAX_VALUE;
        if(extrapol!=null){
            for(ArrayList<Point> ap : extrapol){
                for(Point p : ap){
                    if(p.getV()<courant){
                        courant=p.getV();
                    }
                }
            }
        }
        return courant;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getURLImg() {
        return URLImg;
    }

    public void setURLImg(String URLImg) {
        this.URLImg = URLImg;
    }
    
    
    
    
}
